//注册在全局的MVVM方法
//options : 配置项
function MVVM(options) {
    //this:MVVM的实例对象
    this.$options = options;
    //data:配置项中的数据选项
    var data = this._data = this.$options.data;
    //me:MVVM的实例对象   this劫持
    var me = this;

    //Object.keys : 返回对应对象的可枚举属性组成的数组
    // Object.keys(data): 所有数据名称组成的数组
    Object.keys(data).forEach(function(key) {
        // key:一个个数据名称
        me._proxy(key);
    });

    //数据劫持 data:配置项中的数据  this:MVVM的实例对象
    observe(data, this);

    //模板解析
    //this:MVVM的实例对象
    this.$compile = new Compile(options.el || document.body, this)
}

MVVM.prototype = {
    $watch: function(key, cb, options) {
        new Watcher(this, key, cb);
    },

    //实现了数据代理!!!
    _proxy: function(key) {
        // key:一个个数据名称
        var me = this;// this劫持

        //me:MVVM的实例对象(vm)
        //在给vm实例对象 添加新的属性(属性名来至于data)
        Object.defineProperty(me, key, {
            configurable: false,
            enumerable: true,
            get: function proxyGetter() {
                //me._data : option中的data
                return me._data[key];
            },
            set: function proxySetter(newVal) {
                //me._data : option中的data
                me._data[key] = newVal;
            }
        });
    }
};